import axios from "axios";
import nprogress from "nprogress";
import "nprogress/nprogress.css";
// 创建实例
const requestList = new Map();

/**
 * 添加请求
 * @param {Object} config
 */
const addPending = (config) => {
  // console.log(config);
  const url = [
    config.method,
    config.url,
    JSON.stringify(config.data),
    JSON.stringify(config.params),
  ].join("&");
  // console.log(url, 7777);
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken((cancel) => {
      // console.log(cancel, "cancel5433333333");
      if (!requestList.has(url)) {
        // 如果 pending 中不存在当前请求，则添加进去
        requestList.set(url, cancel);
      }
    });
};
/**
 * 移除请求
 * @param {Object} config
 */
const removePending = (config) => {
  const url = [
    config.method,
    config.url,
    JSON.stringify(config.data),
    JSON.stringify(config.params),
  ].join("&");

  if (requestList.has(url)) {
    // 如果在 pending 中存在当前请求标识，需要取消当前请求，并且移除

    const cancel = requestList.get(url);

    cancel(url);
    requestList.delete(url);
  }
};
/**
 * 清空 pending 中的请求（在路由跳转时调用）
 */
export const clearPending = () => {
  for (const [url, cancel] of requestList) {
    cancel(url);
  }
  pending.clear();
};
const instance = axios.create({
  baseURL: "http://localhost:8008",
  timeout: 10000,
});

// 请求拦截器
instance.interceptors.request.use((config) => {
  // removePending(config); // 在请求开始前，对之前的请求做检查取消操作
  addPending(config); // 将当前请求添加到 pending 中
  nprogress.start();
  if (localStorage.getItem("token")) {
    config.headers.Authorization = "Bearer " + localStorage.getItem("token");
  }
  return config;
});
// 请求响应器
instance.interceptors.response.use((res) => {

  removePending(res.config); // 在请求结束后，移除本次请求
  nprogress.done();
  return res;
}),
  (err) => {
    // 请求失败
    console.log(err);

    removePending(err.config); // 在请求结束后，移除本次请求
  };
export default instance;
